package showtime.framework.manager
{
	import flash.display.DisplayObject;
	import flash.events.MouseEvent;
	
	import showtime.framework.core.pattern.Singleton;
	import showtime.framework.manager.supportClasses.drag.DragProxy;
	import showtime.framework.manager.supportClasses.drag.IDrag;

	/**
	 * @project uniplatform
	 * @date 2011-7-4
	 * @author 绿豆蛙
	 * 
	 */
	public final class DragManager extends Singleton
	{
		/**
		 * 直接进行拖拽操作。 
		 */		
		public static const DIRECT:String = "DIRECT";
		/**
		 * 复制一份拖拽副本。 
		 */		
		public static const COPY:String = "COPY";
		/**
		 * 保存管理器拖拽源。 
		 */		
		private var items:Array = null;
		/**
		 * 拖拽代理对象。 
		 */		
		private var proxy:DragProxy = null;
		
		public function DragManager()
		{
			initialize();
		}
		
		public static function getInstance():DragManager
		{
			return DragManager(Singleton.getInstanceOrCreate(DragManager));
		}
		
		override protected function initialize():void
		{
			items = [];
			proxy = new DragProxy();
		}
		/**
		 * 注册显示对象。 
		 * 
		 */		
		public function register(item:DisplayObject):void
		{
			items.push(item);
			
			item.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler)
			item.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
		}
		
		/**
		 * 移处显示对象。 
		 * 
		 */		
		public function unRegister(item:DisplayObject):void
		{
			for (var i:int = 0, length:int = items.length; i < length; i++)
			{
				if (items[i] == item)
				{
					items.splice(i, 1);
					
					break;
				}
			}
		}
		
		////////////////////////////////////////
		//			Event listeners.          //
		////////////////////////////////////////	
		/**
		 * 拖拽结束。 
		 * @param evt
		 * 
		 */		
		private function mouseUpHandler(evt:MouseEvent):void
		{
			//evt.stopImmediatePropagation();	
			IDrag(evt.currentTarget).dragStop(proxy);
			
			if (proxy.from != null)
			{
				proxy.from.dragExit();
			}
	
			proxy.destroy();
		}
		
		/**
		 * 拖拽开始。
		 *  
		 * @param evt
		 * 
		 */		
		private function mouseDownHandler(evt:MouseEvent):void
		{
			evt.stopImmediatePropagation();	
			
			proxy.from = evt.currentTarget;
			proxy.source = evt.target;
			
			IDrag(evt.currentTarget).dragStart(proxy);			
			
		}
	}
}